package com.wz.one;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: 被观察者基类,我们希望它能够通用，所以定义成泛型，
 * 内部应该暴露出register和unRegister供观察者订阅和取消订阅，至于观察者的保存，
 * 我们用ArrayList即可，另外，当主题发生变化的时候，需要通知观察者来做出响应，
 * 还需要一个notifyObservers方法
 * @author: WZ
 * @create: 2019-02-15 23:35
 **/

public class Observable<T> {

    List<Observer<T>> mObservables = new ArrayList<>();

    public void register(Observer observer){
        if(observer == null){
            throw new NullPointerException("observable == null");
        }

        synchronized (this){
            if(!mObservables.contains(observer)){
                mObservables.add(observer);
            }
        }
    }

    public void unregister(Observable observable){
        mObservables.remove(observable);
    }

    public void notifyObservers(T data){
        for (Observer observer:mObservables){
            observer.onUpdate(this,data);
        }
    }

}
